#include <bits/stdc++.h>
using namespace std;

const int dirx[4] = {0,0,1,-1};
const int diry[4] = {1,-1,0,0};
int best;
int mins[1001][1001];

bool judge(int (*a)[6], int x, int y, int flag)
{
	if (x>0&&x<=5&&y>0&&y<=5&&a[x][y]!='#')
	{
		return true;
	}
	else if (flag && a[x][y]=='X')
	{
		return true;
	}
	return false;
}

void dfs(int (*a)[6], int x, int y, int pos)
{
	if (pos>best)
	{
		return;
	}
	if (x==5&&y==5)
	{
		if (pos<best)
		{
			best=pos;
		}
		return;
	}
	int flag = 0;
	if (a[x][y] == '%')
	{
		flag += 3;
	}
	if (flag && a[x][y]=='X')
	{
		flag--;
	}
	for (int i = 0; i < 4; i++)
	{
		int tox = x + dirx[i];
		int toy = y + diry[i];
		if (judge(a,tox,toy,flag)&&mins[x][y]>=pos+1)
		{
			a[tox][toy] = '#';
			mins[tox][toy]=pos+1;
			dfs(a,tox,toy,pos+1);
			a[tox][toy] = '.';
		}
	}
}

int main()
{
	memset(mins,1,sizeof(mins));
	int N=5,K=3;
	//scanf("%d%d",&N,&K);
	int a[6][6]=
	{
		'#','#','#','#','#','#',
		'#','.','.','.','X','X',
		'#','#','#','%','#','.',
		'#','.','.','.','#','.',
		'#','.','#','#','#','.',
		'#','.','.','.','.','.'
	};
	/*
	for (int i = 0; i < N;i++)
	{
		for (int j = 0; j < N; j++)
		{
			if (i==0||j==0)
			{
				a[i][j] = '#';
			}
			else
			{
				scanf("%c", &a[i][j]);
			}
		}
	}*/
	best = 1 << 28;
	dfs(a,1,1,0);
	cout << best << endl;
	return 0;
}
